package library.frame;

import library.logic.ManagementSystem;
import library.logic.Post;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Vector;

/**
 * User: RockCrazy
 * Date: 03.01.12
 * Time: 1:37
 */
public class WinPost extends JDialog implements ActionListener
{
	// Владелец нашего окна - вводим для вызова нужного нам метода
	private MainFrame owner;

	// Результат нажатия кнопок
	private boolean result = false;

	// Параметры читателя
	private int postId = 0;
	private JTextField postName = new JTextField();     // наименование Издательства
	private JTextField postAdress = new JTextField();   // Адрес Издательства
	private JTextField postPhone = new JTextField();    // Телефон
	private JTextField postUrl = new JTextField();      // URL

	// Параметры окна
	private static final int D_HEIGHT = 550;    // высота окна
	private final static int D_WIDTH = 450;     // ширина окна
	private final static int L_X = 10;          // левая граница метки для поля
	private final static int L_W = 100;         // ширина метки для поля
	private final static int C_W = 150;         // ширина поля
	private ManagementSystem ms;
	private JTable postsTab;

	/**
	 * @param newPost знак добавления читателя или исправление
	 * @param owner родительская форма
	 */
	public WinPost(boolean newPost, MainFrame owner)
	{
		// После вставки издателя без закрытия окна нам потребуется перегрузка списка
		// А для этого нам надо иметь доступ к этому методу в главной форме
		this.owner = owner;
		try
		{
			ms = new ManagementSystem();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		// Установить заголовок
		setTitle("Информация о Издателях");

		// Не будем использовать layout совсем
		getContentPane().setLayout(null);

		// Разместим компоненты по абсолютным координатам

		// Наименование
		JLabel lName = new JLabel("Наименование:", JLabel.RIGHT);
		lName.setBounds(L_X, 10, L_W, 20);
		getContentPane().add(lName);
		postName.setBounds(L_X + L_W + 10, 10, C_W, 20);
		getContentPane().add(postName);

		// Адрес
		JLabel lAdr = new JLabel("Адрес:", JLabel.RIGHT);
		lAdr.setBounds(L_X, 35, L_W, 20);
		getContentPane().add(lAdr);
		postAdress.setBounds(L_X + L_W + 10, 35, C_W, 20);
		getContentPane().add(postAdress);

		// Телефон
		JLabel lTelf = new JLabel("Телефон:", JLabel.RIGHT);
		lTelf.setBounds(L_X, 60, L_W, 20);
		getContentPane().add(lTelf);
		postPhone.setBounds(L_X + L_W + 10, 60, C_W, 20);
		getContentPane().add(postPhone);

		// Url
		JLabel lUrl = new JLabel("URL:", JLabel.RIGHT);
		lUrl.setBounds(L_X, 85, L_W, 20);
		getContentPane().add(lUrl);
		postUrl.setBounds(L_X + L_W + 10, 85, C_W, 20);
		getContentPane().add(postUrl);

		// Создаем таблицу для вывода списка клиентов
		postsTab = new JTable(1, 5);
		postsTab.getSelectionModel().addListSelectionListener(new RowListener());
		reloadPosts();
		JScrollPane scrollPane = new JScrollPane(postsTab);
		scrollPane.setBounds(L_X, 120, 415, 385);
		getContentPane().add(scrollPane);


		JButton btnCancel = new JButton("Выход");
		btnCancel.setName("Выход");
		btnCancel.addActionListener(this);
		btnCancel.setBounds(L_X + L_W + C_W + 10 + 50, 43, 100, 25);
		getContentPane().add(btnCancel);

		// если newPost = true
		if (newPost)
		{
			JButton btnOk = new JButton("OK");
			btnOk.setName("OK");
			btnOk.addActionListener(this);
			btnOk.setBounds(L_X + L_W + C_W + 10 + 50, 10, 100, 25);
			getContentPane().add(btnOk);

			JButton btnNew = new JButton("Добавить");
			btnNew.setName("Добавить");
			btnNew.addActionListener(this);
			btnNew.setBounds(L_X + L_W + C_W + 10 + 50, 73, 100, 25);
			getContentPane().add(btnNew);
		}
		// если newPost = false
		else
		{
			JOptionPane.showMessageDialog(this, "<html><font color=red>Внимание! Включен режим редактирования!");
			JButton btnDel = new JButton("<html><font color=red>Удалить");
			btnDel.setName("Удалить");
			btnDel.addActionListener(this);
			btnDel.setBounds(L_X + L_W + C_W + 10 + 50, 10, 100, 25);
			getContentPane().add(btnDel);

			setTitle("Редактирование издателей");
			JButton btnSave = new JButton("Сохранить");
			btnSave.setName("Сохранить");
			btnSave.addActionListener(this);
			btnSave.setBounds(L_X + L_W + C_W + 10 + 50, 73, 100, 25);
			getContentPane().add(btnSave);
		}

		// Устанавливаем поведение формы при закрытии - не закрывать совсем.
		setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

		// Получаем размеры экрана
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		// А теперь просто помещаем его по центру, вычисляя координаты на основе полученной информации
		setBounds(((int) d.getWidth() - WinPost.D_WIDTH) / 2, ((int) d.getHeight() - WinPost.D_HEIGHT) / 2, WinPost.D_WIDTH, WinPost.D_HEIGHT);

	}

	// Получить результат, true - кнопка ОК, false - кнопка Cancel
	public boolean getResult()
	{
		return result;
	}

	// Установить поля соответственно переданным данным о читателе
	public void setPost(Post post)
	{
		postId = post.getPostId();
		postName.setText(post.getPostName());
		postAdress.setText(post.getPostAdress());
		postPhone.setText(post.getPostPhone());
		postUrl.setText(post.getPostURL());

	}

	// Вернуть данные в виде нового читателя с соотвтествующими полями
	public Post getPost()
	{
		Post post = new Post();
		post.setPostId(postId);
		post.setPostName(postName.getText());
		post.setPostAdress(postAdress.getText());
		post.setPostPhone(postPhone.getText());
		post.setPostURL(postUrl.getText());
		return post;
	}

	public void actionPerformed(ActionEvent aE)
	{
		JButton src = (JButton) aE.getSource();
		// Добавляем читателя, но не закрываем окно
		// Здесь мы не будем вызывать в отдельном потоке сохранение.
		// Оно не занимает много времени и лишние действия здесь не оправданы
		if (src.getName().equals("Добавить"))
		{
			result = true;
			try
			{
				ManagementSystem.getInstance().insertPost(getPost());
				reloadPosts();
				postName.setText("");
				postAdress.setText("");
				postPhone.setText("");
				postUrl.setText("");
			}
			catch (Exception sql_e)
			{
				JOptionPane.showMessageDialog(this, sql_e.getMessage());
			}
			return;
		}
		if (src.getName().equals("Сохранить"))
		{
			result = true;
			try
			{
				ManagementSystem.getInstance().updatePost(getPost());
				reloadPosts();
			}
			catch (Exception sql_e)
			{
				JOptionPane.showMessageDialog(this, sql_e.getMessage());
			}
			return;
		}
		if (src.getName().equals("Удалить"))
		{

			result = true;
			deletePost();
			postName.setText("");
			postAdress.setText("");
			postPhone.setText("");
			postUrl.setText("");
			return;

		}

		// Смена ФЛАГА
		if (src.getName().equals("OK"))
		{
			result = true;
		}
		if (src.getName().equals("Выход"))
		{
			result = false;
		}
		setVisible(false);
	}

	// метод для удаления исполнителя
	private void deletePost()
	{
		try
		{
			ms = new ManagementSystem();
			Thread t = new Thread()
			{
				public void run()
				{
					if (postsTab != null)
					{
						PostTableModel stm = (PostTableModel) postsTab.getModel();
						// Проверяем - выделен ли хоть какой-нибудь читатель
						if (postsTab.getSelectedRow() >= 0)
						{
							if (JOptionPane.showConfirmDialog(WinPost.this,
									"<html><font color=red>Вы хотите удалить читателя?", "Удаление читателя",
									JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
							{
								Post post = stm.getPost(postsTab.getSelectedRow());
								try
								{
									ms.deletePost(post);
									reloadPosts();
								}
								catch (SQLException e)
								{
									JOptionPane.showMessageDialog(WinPost.this, e.getMessage());
								}
							}
						} // Если читатель не выделен - сообщаем пользователю, что это необходимо
						else
						{
							JOptionPane.showMessageDialog(WinPost.this, "<html><font color=blue>Необходимо выделить читателя в списке");
						}

					}
				}
			};
			t.start();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

	/**
	 * Метод для обеспечения интерфейса ListSelectionListener
 	 */
	public void valueChanged(ListSelectionEvent e)
	{
		if (!e.getValueIsAdjusting())
		{
			reloadPosts();
		}

	}

	/**
	 *  метод для обновления списка Издателей
	 */
	public void reloadPosts()
	{
		// Создаем анонимный класс для потока
		Thread t = new Thread()
		{
			// Переопределяем в нем метод run
			public void run()
			{
				if (postsTab != null)
				{
					try
					{
						// Получаем список издательств
						Collection<Post> lPost = ms.getPosts();
						// И устанавливаем модель для таблицы с новыми данными
						postsTab.setModel(new PostTableModel(new Vector<Post>(lPost)));
					}
					catch (SQLException e)
					{
						JOptionPane.showMessageDialog(WinPost.this, e.getMessage());
					}
				}
			}
		};
		// И теперь мы запускаем наш поток
		t.start();
	}

	/**
	 * Метод для обеспечения интерфейса ChangeListener
	 * @param e
	 */
	public void stateChanged(ChangeEvent e)
	{
		reloadPosts();
	}

	/**
	 * Метод слушателя строк`
	 */
	private class RowListener implements ListSelectionListener
	{

		public void valueChanged(ListSelectionEvent event)
		{
			PostTableModel ctm = (PostTableModel) postsTab.getModel();
			Post post = ctm.getPost(postsTab.getSelectedRow());

			if (event.getValueIsAdjusting())
			{
				return;
			}
			try
			{
				setPost(post);
			}
			catch (Exception sql_e)
			{
				JOptionPane.showMessageDialog(WinPost.this, "<html><font color=green>Данные успешно сохранены");
			}
		}
	}
}
